/*
通过mutation间接更新state的多个方法的对象
actions.js //其实这里定义的方法只是将mutation.js中定义的方法进行了一次封装,就是去触发mutations.js中的方法。如果传如的参数需要异步获取的话，我们可以在这里等待异步返回成功后在触发mutations中的方法。在组件中这两个文件定义的方法都可以直接调用，mutations中定义的方法是通过store.dispath(′ADDBOOK′,book)调用的，而actons定义的方法是通过store.dispath(′ADDBOOK′,book)调用的，而actons定义的方法是通过store.commit(‘ADD_BOOK’,book),调用的。
 */
import {
  RECEIVE_ADDRESS,
  RECEIVE_CATEGORYS,
  RECEIVE_SHOPS,
  RECEIVE_USER_INFO,
  RESET_USER_INFO,
  RECEIVE_GOODS,
  RECEIVE_RATINGS,
  RECEIVE_INFO,
  INCREMENT_FOOD_COUNT,
  DECREMENT_FOOD_COUNT,
  CLEAR_CART,
  RECEIVE_SEARCH_SHOPS
} from './mutation-types'
import {
  reqAddress,
  reqFoodCategorys,
  reqShops,
  reqUserInfo,
  reqLogout,
  reqShopRatings,
  reqShopGoods,
  reqShopInfo,
  reqSearchShop
} from '../api'

// async    await   操作异步方法
export default {
  // 异步获取地址
  async getAddress({
    commit,
    state
  }) {
    // 发送异步ajax请求    
    const geohash = state.latitude + ',' + state.longitude //现在参数都在state里面取数据要在state取
    const result = await reqAddress(geohash)
    // 提交一个mutation
    if (result.code === 0) {
      const address = result.data //此处定义名字是和state存储的名字一样    state 存储应该和api文件名字一样  
      commit(RECEIVE_ADDRESS, { //同步获得数据
        address
      })
      // console.log(RECEIVE_ADDRESS)
    }
  },

  // 异步获取食品分类列表
  async getCategorys({
    commit
  }) {
    // 发送异步ajax请求
    const result = await reqFoodCategorys()
    // 提交一个mutation
    if (result.code === 0) {
      const categorys = result.data
      commit(RECEIVE_CATEGORYS, {
        categorys
      })
      // console.log(categorys)
    }
  },

  // 异步获取商家列表
  async getShops({
    commit,
    state
  }) {
    // 发送异步ajax请求
    // const {
    //   longitude,
    //   latitude
    // } = state
    const longitude = state.longitude;
    const latitude = state.latitude;
    const result = await reqShops(longitude, latitude)
    // 提交一个mutation
    if (result.code === 0) {
      const shops = result.data
      commit(RECEIVE_SHOPS, {
        shops
      })
    }
  },

  // 同步记录用户信息
  recordUser({
    commit
  }, userInfo) {
    commit(RECEIVE_USER_INFO, {
      userInfo
    })
  },

  // 异步获取用户信息
  async getUserInfo({
    commit
  }) {
    const result = await reqUserInfo()


    if (result.code === 0) {
      const userInfo = result.data
      commit(RECEIVE_USER_INFO, {
        userInfo
      })
    }
  },

  // 异步登出
  async logout({
    commit
  }) {
    const result = await reqLogout()
    if (result.code === 0) {
      commit(RESET_USER_INFO)
    }
  },

  // 异步获取商家信息
  async getShopInfo({
    commit
  }) {
    const result = await reqShopInfo()
    if (result.code === 0) {
      const info = result.data
      commit(RECEIVE_INFO, {
        info
      })
    }
  },

  // 异步获取商家评价列表
  async getShopRatings({
    commit
  }, callback) {
    const result = await reqShopRatings()
    if (result.code === 0) {
      const ratings = result.data
      commit(RECEIVE_RATINGS, {
        ratings
      })
      // 数据更新了, 通知一下组件
      callback && callback()
    }

  },
  // 异步获取商家商品列表
  async getShopGoods({
    commit
  }, callback) {
    const result = await reqShopGoods()
    if (result.code === 0) {
      const goods = result.data
      commit(RECEIVE_GOODS, {
        goods
      })
      // 数据更新了, 通知一下组件
      callback && callback() //如果存在这个回调就执行这个函数   //相当于if判断
    }
  },

  // 同步更新food中的count值
  updateFoodCount({
    commit
  }, {
    isAdd,
    food
  }) {
    if (isAdd) { //更新增加
      commit(INCREMENT_FOOD_COUNT, {
        food
      })
    } else { //更新减少
      commit(DECREMENT_FOOD_COUNT, {
        food
      })
    }
  },

  // 同步清空购物车
  clearCart({
    commit
  }) {
    commit(CLEAR_CART)
  },

  // 异步获取商家商品列表
  async searchShops({
    commit,
    state
  }, text) {

    const geohash = state.latitude + ',' + state.longitude
    const result = await reqSearchShop(geohash, text)
    if (result.code === 0) {
      const searchShops = result.data
      commit(RECEIVE_SEARCH_SHOPS, {
        searchShops
      })
    }
  },
}
